#!/usr/bin/env node

// 引入需要使用的模块
const fs = require('fs-extra')
const path = require('path')
const inquirer = require('inquirer')
const ejs = require('ejs')

// 调用inquirer中的prompt方法来实现交互式命令行
inquirer.prompt([
    {
        type: 'input',
        name: 'name',
        message: 'hi guys what are you call?',
        default: path.basename(process.cwd())
    },
    {
        type: 'input',
        name: 'version',
        message: 'project version?',
        default: '1.0.0'
    }
]).then(answers => {
    // 进行文件的读写，读取templates中的文件 经过ejs加工 写入全新的项目目录

    // 模板路径
    const tempath = path.join(__dirname, 'templates')
    // 目标路径
    const targetPath = process.cwd()
    // 通过模板路径获取其中所有文件的相对路径
    // 获取templates中所有文件的相对路径 
    let fileList = readFileList(tempath, tempath)
    // 通过循环遍历fileList 交给ejs加工后追加到新的目录中
    fileList.forEach((item, index) => {
        /**
         * @param { string } 完整路径
         * @param { Object } data
         * @param { Function } callback
         */
        ejs.renderFile(path.join(tempath, item), answers, (error, result) => {
            if (error) throw error
            // 通过fs-extra中的outputFileSync来输出内容到新的文件中
            // 如果路径不存在会自动创建
            fs.outputFileSync(path.join(targetPath, item), result)
            console.log('\x1B[33m',`create ${item}`);
            if (index === fileList.length - 1) {
                console.log('\x1B[33m',`${ answers.name } is ready now !`);
            }
        })
    })


})


/**
 * 输入一个目录，递归读取其中文件路径，返回这些文件与目标目录的相对路径数组
 * @param {String} 要读取内容的目录绝对路径 
 * @param {String} 计算相对路径的目标目录 
 * @param {Array} 结果数组 
 * @returns {Array} 结果数组 
 */

function readFileList(dir, from, filesList = [],) {
    const files = fs.readdirSync(dir)
    files.forEach(item => {
        var fullPath = path.join(dir, item)
        const stat = fs.statSync(fullPath)
        if (stat.isDirectory()) {
            readFileList(path.join(dir, item), from, filesList)
        } else {
            filesList.push(path.relative(from, fullPath))
        }
    })
    return filesList
}